package 剑指II;

/**
 * @description:
 * @author: 小白白
 * @create: 2021-10-24
 **/

public class Jz004只出现一次的数字 {

    /**
     * 给你一个整数数组 nums ，除某个元素仅出现 一次 外，其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
     * <p>
     * 示例 1：
     * 输入：nums = [2,2,3,2]
     * 输出：3
     * 示例 2：
     * 输入：nums = [0,1,0,1,0,1,100]
     * 输出：100
     *  
     * 提示：
     * 1 <= nums.length <= 3 * 104
     * -231 <= nums[i] <= 231 - 1
     * nums 中，除某个元素仅出现 一次 外，其余每个元素都恰出现 三次
     *  
     * 进阶：你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗？
     */

    public int singleNumber(int[] nums) {

        int result = 0;
        for (int i = 0; i < 32; i++) {
            // 每一位的值
            int n = 1 << i;
            int count = 0;
            for (int num : nums) {
                if ((n & num) != 0) {
                    count++;
                }
            }
            if (count % 3 == 1) {
                result |= n;
            }
        }

        return result;
    }

    public static void main(String[] args) {
        Jz004只出现一次的数字 n = new Jz004只出现一次的数字();
        int[] arr = {3, 3, 3, 2, 2, 2, 1};
        int result = n.singleNumber(arr);
        System.out.println(result);
    }

}
